package com.jvm;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * 项目名称: java_algorithm
 * @ClassName BlockingQueueTest
 * @Description
 * @Author huipanxing huipanxing@chinasofti.com   @Date 2021/10/11 15:25
 */
public class BlockingQueueTest {

    /**
     * 往队列放的方法：
     *   1:put() 追加到队列尾部 队列满就阻塞
     *   2:add() 追加到队列尾部 追加成功就返回true 失败则抛IllegalStateException异常
     *   3:offer() 追加到队列尾部 追加成功就返回true 失败则返回false
     * 从队列取的方法：
     *   1:take() 从队列头部取 队列为空就阻塞
     *   2:peek() 从队列头部取但不移除 如果队列为空就返回null
     *   3:poll() 从队列头部取并移除 如果队列为空就返回null
     */
    public static void main(String[] args) throws InterruptedException {
        LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>(10);

        new Thread(() -> {
            for (int i = 0; i <= 1000; i++) {
                try {
                    Thread.sleep(1000);
                    linkedBlockingQueue.put(i);
                    System.out.println("放"+i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
//        Thread.sleep(1000);
        new Thread(() -> {
            for (int i = 0; i <= 1000; i++) {
                try {
                    Thread.sleep(1000);
                    Integer poll = linkedBlockingQueue.take();
                    System.out.println("取"+poll);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}
